LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

TankWar

2022/7/11 后端

绘制窗口 + 显示颜色

  • paint(Graphics g)

java绘图时,最常使用到的就是paint(Graphics g){…内容…}方法获取画笔,然后利用JPanel等容器作为画布,在JFrame内呈现出内容,很多情况下这种方式都还是很实用,

import javax.swing.*;
import java.awt.*;

public class GamePanel extends JFrame {
    int width = 800;
    int height = 610;
    public void launch(){
        setTitle("TankWar");
        setSize(width,height);
        setLocationRelativeTo(null); //使屏幕居中
        setDefaultCloseOperation(3); //添加关闭事件
        setResizable(false); //用户不能改变大小
        setVisible(true); //使窗口可见
        this.addKeyListener(new GamePanel.KeyMonitor()); //添加键盘监视器
    }

    //paint()方法
    @Override
    public void paint(Graphics g){
        g.setColor(Color.gray);
        g.fillRect(0,0,width,height); //绘制实心矩形
        g.setColor(Color.blue);
        g.setFont(new Font("仿宋",Font.BOLD,50));
        g.drawString("选择游戏模式",220,100);
        g.drawString("单人模式",220,200);
        g.drawString("双人模式",220,300);
    }

    public static void main(String[] args) {
        GamePanel gp = new GamePanel();
        gp.launch();
    }
}

键盘监听

基于JFrameKeyAdapter

class KeyMonitor extends KeyAdapter{ //键盘监视器
        @Override //按下键盘
        public void keyPressed(KeyEvent e){
            System.out.println(e.getKeyChar()); //返回键值 输出按键
        }
    }
  • printStackTrace()

当try语句中出现异常是时,会执行catch 中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象异常名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace();。printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。(这是白话解释,比较容易理解)

添加图片tank指针

public class GamePanel extends JFrame { //指针图片
Image select = Toolkit.getDefaultToolkit().getImage("images/selecttank.gif");
}
            while(true){ //重绘
            repaint();
            try {
                Thread.sleep(25);
            }catch (Exception e){
                e.printStackTrace();
            }
        }

paint()方法{ g.drawImage(select,160,y,null); //绘制指针}

键盘监听2

class KeyMonitor extends KeyAdapter{ //键盘监视器
        @Override //按下键盘
        public void keyPressed(KeyEvent e){
            //返回键值
            int key = e.getKeyCode();
            switch (key){
                case KeyEvent.VK_UP: //按键1的键值
                    a = 1;
                    y = 150;
                    break;
                case KeyEvent.VK_DOWN:
                    a = 2;
                    y = 250;
                    break;
                case KeyEvent.VK_ENTER:
                    state = a;
                    break;
            }
//            System.out.println(e.getKeyChar()); //返回键值 输出按键
        }
    }

public class GamePanel extends JFrame{int a = 1; //当按下回车的时候去选择开始游戏模式}

双缓存机制

定义双缓存图片(重新创建一个空的图片,把所有组件先绘制到空图片上,再把绘制好的图片一次性绘制到主窗口当中)

public class GamePanel extends JFrame{    Image offScreemImage = null; }

public void paint(Graphics g){
        //创建和容器一样大小的Image图片
        if(offScreemImage == null){
            offScreemImage = this.createImage(width,height);
        }
        //获取该图片的画笔
        Graphics gImage = offScreemImage.getGraphics();
}
...把元素绘制到新的图片上[g.drawString()变成gImage.drawString()] 
gImage._______________________


临时代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class GamePanel extends JFrame {
    int width = 800;
    int height = 610;
    //定义双缓存图片(重新创建一个空的图片,把所有组件先绘制到空图片上,再把绘制好的图片一次性绘制到主窗口当中)
    Image offScreemImage = null;
    //指针图片
    Image select = Toolkit.getDefaultToolkit().getImage("images/selecttank.gif");
    int y = 150; //指针初始纵坐标
    int state = 0; //游戏模式 0 开始,1 单人模式,2 双人模式
    int a = 1; //当按下回车的时候去选择开始游戏模式
    public void launch(){
        setTitle("TankWar");
        setSize(width,height);
        setLocationRelativeTo(null); //使屏幕居中
        setDefaultCloseOperation(3); //添加关闭事件
        setResizable(false); //用户不能改变大小
        setVisible(true); //使窗口可见
        this.addKeyListener(new GamePanel.KeyMonitor()); //添加键盘监视器
        while(true){ //重绘
            repaint();
            try {
                Thread.sleep(25);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    //paint()方法
    @Override
    public void paint(Graphics g){
        //创建和容器一样大小的Image图片
        if(offScreemImage == null){
            offScreemImage = this.createImage(width,height);
        }
        //获取该图片的画笔
        Graphics gImage = offScreemImage.getGraphics();
        gImage.setColor(Color.gray);
        gImage.fillRect(0,0,width,height); //绘制实心矩形
        gImage.setColor(Color.blue);
        gImage.setFont(new Font("仿宋",Font.BOLD,50));
        if(state == 0) { //state = 0, 游戏未开始
            gImage.drawString("选择游戏模式", 220, 100);
            gImage.drawString("单人模式", 220, 200);
            gImage.drawString("双人模式", 220, 300);
            gImage.drawImage(select, 160, y, null); //绘制指针
        }
        else if(state == 1 || state == 2){
            gImage.drawString("游戏开始",220,100);
            if(state == 1){
                gImage.drawString("单人模式",220,200);
            }else{
                gImage.drawString("双人模式",220,200);
            }
        }
        /**将缓存区绘制好的图形整个绘制到容器的画布中**/
        g.drawImage(offScreemImage,0,0,null);
    }

    class KeyMonitor extends KeyAdapter{ //键盘监视器
        @Override //按下键盘
        public void keyPressed(KeyEvent e){
            //返回键值
            int key = e.getKeyCode();
            switch (key){
                case KeyEvent.VK_UP: //按键1的键值
                    a = 1;
                    y = 150;
                    break;
                case KeyEvent.VK_DOWN:
                    a = 2;
                    y = 250;
                    break;
                case KeyEvent.VK_ENTER:
                    state = a;
                    break;
            }
//            System.out.println(e.getKeyChar()); //返回键值 输出按键
        }
    }

    public static void main(String[] args) {
        GamePanel gp = new GamePanel();
        gp.launch();
    }
}

image-20220711105424955